package cn.edu.swu.miniwebsvr.core;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class HttpParser {

    public static Parameter parse(InputStream inputStream) throws IOException {
        Parameter parameter = new Parameter();
        // TODO: [222024321072052/然娜·吐尔逊汗]
        // 用BufferedReader按行读取请求（处理字符编码，避免乱码）
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(inputStream, StandardCharsets.UTF_8)
        );

        // 1. 解析请求行（格式：GET /echo?name=A HTTP/1.1）
        String requestLine = reader.readLine();
        if (requestLine == null || requestLine.isEmpty()) {
            throw new IOException("无效的HTTP请求行");
        }
        parseRequestLine(requestLine, parameter);

        // 2. 解析请求头（逐行读取，直到空行结束）
        String headerLine;
        Map<String, String> headers = new HashMap<>();
        while ((headerLine = reader.readLine()) != null && !headerLine.isEmpty()) {
            // 拆分请求头（格式：Key: Value），注意冒号后可能有空格
            int colonIndex = headerLine.indexOf(':');
            if (colonIndex > 0) {
                String key = headerLine.substring(0, colonIndex).trim();
                String value = headerLine.substring(colonIndex + 1).trim();
                headers.put(key, value);
            }
        }
        parameter.setHeaders(headers); // 将解析的请求头存入Parameter

        // 3. 解析请求体（仅POST请求，且Content-Type为application/x-www-form-urlencoded）
        String method = parameter.getMethod();
        if ("POST".equalsIgnoreCase(method)) {
            // 从请求头获取Content-Length，确定body长度
            String contentLengthStr = headers.get("Content-Length");
            if (contentLengthStr != null && !contentLengthStr.isEmpty()) {
                int contentLength = Integer.parseInt(contentLengthStr);
                // 读取body内容（注意：BufferedReader可能已读取部分流，改用InputStream直接读）
                char[] bodyChars = new char[contentLength];
                reader.read(bodyChars, 0, contentLength);
                String body = new String(bodyChars);
                // 解析body参数（格式：key1=value1&key2=value2）
                Map<String, String> bodyParams = parseParams(body);
                parameter.setBodyParams(bodyParams);
            }
        }

        return parameter;
    }
    /**
     * 辅助方法：解析请求行，拆分Method、URL、URL参数
     */
    private static void parseRequestLine(String requestLine, Parameter parameter) throws IOException {
        String[] parts = requestLine.split("\\s+"); // 按空格拆分（支持多个空格）
        if (parts.length < 3) {
            throw new IOException("无效的HTTP请求行：" + requestLine);
        }

        // 拆分Method（如GET/POST）
        String method = parts[0].trim();
        parameter.setMethod(method);

        // 拆分URL和URL参数（如/echo?name=A → URL是/echo，参数是name=A）
        String urlWithParams = parts[1].trim();
        int queryIndex = urlWithParams.indexOf('?');
        if (queryIndex > 0) {
            // 有URL参数：拆分URL和参数部分
            String url = urlWithParams.substring(0, queryIndex);
            String urlParamStr = urlWithParams.substring(queryIndex + 1);
            // 解析URL参数
            Map<String, String> urlParams = parseParams(urlParamStr);
            parameter.setUrl(url);
            parameter.setUrlParams(urlParams);
        } else {
            // 无URL参数：直接设置URL
            parameter.setUrl(urlWithParams);
        }

        // 忽略HTTP版本（parts[2]），暂不需要处理
    }


    // TODO: [222024321072052/然娜·吐尔逊汗] 可以添加辅助方法来简化字符串解析和 URL 解码
    /**
     * 辅助方法：解析参数字符串（URL参数或POST body参数）
     * 格式：key1=value1&key2=value2 → 转成Map
     */
    private static Map<String, String> parseParams(String paramStr) throws IOException {
        Map<String, String> params = new HashMap<>();
        if (paramStr == null || paramStr.isEmpty()) {
            return params;
        }

        // 按&拆分参数对
        String[] paramPairs = paramStr.split("&");
        for (String pair : paramPairs) {
            if (pair.isEmpty()) {
                continue;
            }
            // 按=拆分key和value（注意value可能包含=，取第一个=拆分）
            int eqIndex = pair.indexOf('=');
            String key = eqIndex > 0 ? pair.substring(0, eqIndex) : pair;
            String value = eqIndex > 0 ? pair.substring(eqIndex + 1) : "";
            // URL解码（处理空格、中文等特殊字符，如%20→空格）
            key = URLDecoder.decode(key, StandardCharsets.UTF_8.name());
            value = URLDecoder.decode(value, StandardCharsets.UTF_8.name());
            params.put(key, value);
        }

        return params;
    }
}